#include "DataGrid.h"
#include <vector>


DataGrid::DataGrid(std::string encabezado1, std::string encabezado2){
	// Se crea el modelo de datos de la grilla
	this->_refModeloDatos = Gtk::ListStore::create(this->_modelCols);
	this->_grilla.set_model(this->_refModeloDatos);

	// Carga las cabeceras de las columnas y la hace editables
	this->_grilla.append_column_editable(encabezado1, _modelCols.llave);
	this->_grilla.append_column_editable(encabezado2, _modelCols.valor);

	// Las lineas que se dibujan en la grilla
	this->_grilla.set_grid_lines(Gtk::TREE_VIEW_GRID_LINES_BOTH);

	// Que las columnas tengan el mismo tamaño
	std::vector<Gtk::TreeViewColumn*> v = this->_grilla.get_columns();
	std::vector<Gtk::TreeViewColumn*>::iterator it;
	for (it = v.begin(); it != v.end(); it++){
		Gtk::TreeViewColumn* tvc = *it;
		tvc->set_expand(true);
	}

	// Para que se comporte como un widget se guarda la grilla
	// en una scrolledWindow para tener acceso a los scroll bars
	this->set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC);
	this->add(this->_grilla);
}


DataGrid::~DataGrid(){
}


void DataGrid::agregarFila(){
	// Agrega una fila al final del modelo de datos
	this->_refModeloDatos->append();
}


void DataGrid::agregarFila(std::string a, std::string b){
	// Agrega una fila al modelo de datos
	Gtk::TreeModel::iterator it = this->_refModeloDatos->append();
	Gtk::TreeModel::Row fila = *it;

	// Agrega los datos a la fila del modelo de datos
	fila[_modelCols.llave] = a;
	fila[_modelCols.valor] = b;
}


// Elimina la fila actualmente seleccionada, false si falló
bool DataGrid::eliminarFilaSeleccionada(){
	// Primero obtiene el iterator a la fila seleccionada
	Glib::RefPtr<Gtk::TreeSelection> refSelec = this->_grilla.get_selection();
	Gtk::TreeModel::iterator iter = refSelec->get_selected();

	// Si no hay nada seleccionado no hace nada
	if (!iter) return false;

	// Borra la fila seleccionada
	this->_refModeloDatos->erase(iter);
	return true;
}


void DataGrid::eliminarTodasFilas(){
	this->_refModeloDatos->clear();
}


bool DataGrid::obtenerFila(int pos, std::string& a, std::string& b){

	// Busca la fila en la posicion pedida
	Gtk::TreeModel::Children::iterator iter = this->_refModeloDatos->children().begin();
	for (int i=0; i<pos && iter != this->_refModeloDatos->children().end(); i++){
		iter++;
	}

	// No se llego hasta la fila pedida
	if (iter == this->_refModeloDatos->children().end()) return false;

	// Extrae los datos de la fila
	Gtk::TreeModel::Row fila = *iter;
	a = fila[_modelCols.llave];
	b = fila[_modelCols.valor];
	return true;
}



